broadway: Improve touch events
authorAlexander Larsson <alexl@redhat.com>
Thu, 14 Nov 2013 10:03:10 +0000 (11:03 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 14 Nov 2013 10:05:16 +0000 (11:05 +0100)
We now respect core pointer grabs, and we do the pointer emulation
detection on the browser side.

gdk/broadway/broadway-protocol.h
gdk/broadway/broadway-server.c
gdk/broadway/broadway-server.h
gdk/broadway/broadway.js
gdk/broadway/gdkbroadway-server.c
gdk/broadway/gdkdisplay-broadway.h
gdk/broadway/gdkeventsource.c

index db0c4f1c93155c289265d59f94ded41a60ba0335..0e82e942978dbaa85b7c46bf16f4e596a864bf3b 100644 (file)
@@ -82,6 +82,7 @@ typedef struct {
   guint32 touch_type;
   guint32 event_window_id;
   guint32 sequence_id;
+  guint32 is_emulated;
   gint32 root_x;
   gint32 root_y;
   gint32 win_x;
index 3b3baa896b22197a4c58a086e2f8bc72e655f6b4..fb2741e1a1cc2d52ecc9cd592998b639a655b60d 100644 (file)
@@ -238,7 +238,7 @@ update_event_state (BroadwayServer *server,
     server->real_mouse_in_toplevel_id = message->pointer.mouse_window_id;
     break;
   case BROADWAY_EVENT_TOUCH:
-    if (message->touch.touch_type == 0 &&
+    if (message->touch.touch_type == 0 && message->touch.is_emulated &&
         server->focused_window_id != message->touch.event_window_id)
       {
         broadway_server_window_raise (server, message->touch.event_window_id);
@@ -246,6 +246,12 @@ update_event_state (BroadwayServer *server,
         broadway_server_flush (server);
       }
 
+    if (message->touch.is_emulated)
+      {
+        server->last_x = message->pointer.root_x;
+        server->last_y = message->pointer.root_y;
+      }
+
     server->last_state = message->touch.state;
     break;
   case BROADWAY_EVENT_KEY_PRESS:
@@ -386,6 +392,7 @@ parse_touch_data (guint32 *p, BroadwayInputTouchMsg *data)
   data->touch_type = ntohl (*p++);
   data->event_window_id = ntohl (*p++);
   data->sequence_id = ntohl (*p++);
+  data->is_emulated = ntohl (*p++);
   data->root_x = ntohl (*p++);
   data->root_y = ntohl (*p++);
   data->win_x = ntohl (*p++);
index c073c982bce41c5cd4add270e50da88a7906c744..1021e444515a62a8b6f4f39013df06b28eb19aa6 100644 (file)
@@ -46,6 +46,8 @@ guint32             broadway_server_grab_pointer             (BroadwayServer   *
 guint32             broadway_server_ungrab_pointer           (BroadwayServer   *server,
                                                              guint32           time_);
 gint32              broadway_server_get_mouse_toplevel       (BroadwayServer   *server);
+void                broadway_server_set_show_keyboard        (BroadwayServer   *server,
+                                                              gboolean          show);
 guint32             broadway_server_new_window               (BroadwayServer   *server,
                                                              int               x,
                                                              int               y,
index f8a944075e88825602aa90066824273f4e2a1326..028555dd6f476116d45343fab7b699b07dddab4b 100644 (file)
@@ -106,6 +106,7 @@ var debugDecoding = false;
 var fakeInput = null;
 var showKeyboard = false;
 var showKeyboardChanged = false;
+var firstTouchDownId = null;
 
 var GDK_CROSSING_NORMAL = 0;
 var GDK_CROSSING_GRAB = 1;
@@ -2488,10 +2489,28 @@ function onTouchStart(ev) {
     for (var i = 0; i < ev.changedTouches.length; i++) {
         var touch = ev.changedTouches.item(i);
 
-        var id = getSurfaceId(touch);
+        var origId = getSurfaceId(touch);
+        var id = getEffectiveEventTarget (origId);
         var pos = getPositionsFromEvent(touch, id);
+        var isEmulated = 0;
 
-        sendInput ("t", [0, id, touch.identifier, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
+        if (firstTouchDownId == null) {
+            firstTouchDownId = touch.identifier;
+            isEmulated = 1;
+
+            if (realWindowWithMouse != origId || id != windowWithMouse) {
+                if (id != 0) {
+                    sendInput ("l", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_NORMAL]);
+                }
+
+                windowWithMouse = id;
+                realWindowWithMouse = origId;
+
+                sendInput ("e", [origId, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, GDK_CROSSING_NORMAL]);
+            }
+        }
+
+        sendInput ("t", [0, id, touch.identifier, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
     }
 }
 
@@ -2504,10 +2523,16 @@ function onTouchMove(ev) {
     for (var i = 0; i < ev.changedTouches.length; i++) {
         var touch = ev.changedTouches.item(i);
 
-        var id = getSurfaceId(touch);
+        var origId = getSurfaceId(touch);
+        var id = getEffectiveEventTarget (origId);
         var pos = getPositionsFromEvent(touch, id);
 
-        sendInput ("t", [1, id, touch.identifier, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
+        var isEmulated = 0;
+        if (firstTouchDownId == touch.identifier) {
+            isEmulated = 1;
+        }
+
+        sendInput ("t", [1, id, touch.identifier, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
     }
 }
 
@@ -2520,10 +2545,17 @@ function onTouchEnd(ev) {
     for (var i = 0; i < ev.changedTouches.length; i++) {
         var touch = ev.changedTouches.item(i);
 
-        var id = getSurfaceId(touch);
+        var origId = getSurfaceId(touch);
+        var id = getEffectiveEventTarget (origId);
         var pos = getPositionsFromEvent(touch, id);
 
-        sendInput ("t", [2, id, touch.identifier, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
+        var isEmulated = 0;
+        if (firstTouchDownId == touch.identifier) {
+            isEmulated = 1;
+            firstTouchDownId = null;
+        }
+
+        sendInput ("t", [2, id, touch.identifier, isEmulated, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState]);
     }
 }
 
index 6389c7fdb4bc3ff1240c49f0d96e30afcaaaff91..55ab58bfa760235393f1bedf9c7b705a1e359533 100644 (file)
@@ -804,6 +804,4 @@ _gdk_broadway_server_set_show_keyboard (GdkBroadwayServer *server,
   msg.show_keyboard = show;
   gdk_broadway_server_send_message (server, msg,
                                    BROADWAY_REQUEST_SET_SHOW_KEYBOARD);
-
-  return TRUE;
 }
index 9066261356c60273dfe2ef368155c99c65e4808d..401ac6fa9326d5c07bfe52bcff339e3b06be399f 100644 (file)
@@ -59,8 +59,6 @@ struct _GdkBroadwayDisplay
 
   GdkBroadwayServer *server;
 
-  guint32 touch_sequence_down;
-
   gpointer move_resize_data;
 };
 
index bb2a19fe64dbab394fbbd225d988399d1e6435c0..08dd073b3177eb7248b84722665a066ea4623c31 100644 (file)
@@ -214,7 +214,6 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
     if (window)
       {
         GdkEventType event_type = 0;
-        gboolean is_first_down = FALSE;
 
         switch (message->touch.touch_type) {
         case 0:
@@ -230,25 +229,14 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
           g_printerr ("_gdk_broadway_events_got_input - Unknown touch type %d\n", message->touch.touch_type);
         }
 
-        if (event_type == GDK_TOUCH_BEGIN &&
-            display_broadway->touch_sequence_down == 0)
-          display_broadway->touch_sequence_down = message->touch.sequence_id;
-
-        if (display_broadway->touch_sequence_down == message->touch.sequence_id)
-          is_first_down = TRUE;
-
-        if (event_type == GDK_TOUCH_END &&
-            display_broadway->touch_sequence_down == message->touch.sequence_id)
-          display_broadway->touch_sequence_down = 0;
-
         if (event_type != GDK_TOUCH_BEGIN &&
-            is_first_down && _gdk_broadway_moveresize_handle_event (display, message))
+            message->touch.is_emulated && _gdk_broadway_moveresize_handle_event (display, message))
           break;
 
        event = gdk_event_new (event_type);
        event->touch.window = g_object_ref (window);
        event->touch.sequence = GUINT_TO_POINTER(message->touch.sequence_id);
-       event->touch.emulating_pointer = is_first_down;
+       event->touch.emulating_pointer = message->touch.is_emulated;
        event->touch.time = message->base.time;
        event->touch.x = message->touch.win_x;
        event->touch.y = message->touch.win_y;
@@ -259,7 +247,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
        gdk_event_set_device (event, device_manager->core_pointer);
        gdk_event_set_source_device (event, device_manager->touchscreen);
 
-        if (is_first_down)
+        if (message->touch.is_emulated)
           _gdk_event_set_pointer_emulated (event, TRUE);
 
         if (event_type == GDK_TOUCH_BEGIN || event_type == GDK_TOUCH_UPDATE)